package com.me.web.server;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;


/**
 * NettyConfig 用于配置和管理 Netty 服务器的启动和关闭。
 * 负责启动 Netty 的 TCP 服务器和 WebSocket 服务器，并使用线程池来执行启动任务。
 * 1、 NettyConfig 用于配置和管理 Netty 服务器的启动和关闭
 *
 * @author chenlei
 */
@Slf4j
@Configuration
public class NettyConfig {

    /**
     * TcpServer 用于启动 TCP 服务器
     */
    @Autowired
    private TcpServer tcpServer;

    /**
     * WebSocketServer 用于启动 WebSocket 服务器
     */
    @Autowired
    private WebSocketServer webSocketServer;

    /**
     * ThreadPoolTaskExecutor 执行服务器启动任务的线程池 (可根据具体情况修改，这个是我自己配置的线程池)
     */
    @Autowired
    private ThreadPoolTaskExecutor taskExecutor;


    /**
     * init 方法在 Spring 容器创建并初始化该类的实例后被调用。
     * 该方法使用线程池来执行启动 Netty TCP 服务器和 WebSocket 服务器的任务。
     */
    @PostConstruct
    public void init() {
        // 启动 Netty TCP 服务器
        taskExecutor.execute(() -> {
            try {
                // 调用 TcpServer 的 start 方法启动 TCP 服务器
                tcpServer.start();
            } catch (Exception e) {
                log.error("启动 Netty TCP 服务器 失败,{}", e.getMessage());
                e.printStackTrace();
            }
        });

        // 启动 Netty Websocket 服务器
        taskExecutor.execute(() -> {
            try {
                // 调用 WebSocketServer 的 start 方法启动 WebSocket 服务器
                webSocketServer.start();
            } catch (Exception e) {
                log.error("启动 Netty WebSocketServer 服务器 失败,{}", e.getMessage());
                e.printStackTrace();
            }
        });
    }


    /**
     * destroy 方法在 Spring 容器销毁该类的实例前被调用。
     * 该方法负责关闭线程池，以释放资源。
     */
    @PreDestroy
    public void destroy() {
        // 关闭线程池
        if (taskExecutor != null) {
            taskExecutor.shutdown();
        }
    }
}
